package cn.edu.dlmu.cogo.framework.config;

import cn.edu.dlmu.cogo.framework.context.ContextContainer;
import cn.edu.dlmu.cogo.framework.context.Environment;
import cn.hutool.core.lang.Console;

import java.util.HashMap;
import java.util.Map;

/**
 * @author yixi
 */
public class JavaConfig {

    /**
     * 用于保存JavaConfig默认配置信息
     */
    private static final Map<Class<? extends JavaConfig>,Object> CONFIGS = new HashMap<>();

    /**
     * 设置JavaConfig
     * @param config JavaConfig的子类实例
     * @param <T> JavaConfig的子类
     */
    public static <T extends JavaConfig> void setConfig(T config){
        if (config != null){
            CONFIGS.put(config.getClass(),config);
            Console.log("{} [CogoConfig]向JavaConfig设置配置类成功[{}]", Environment.getSystemTime(), config.getClass().getName());
        }
    }

    /**
     * 获取JavaConfig，如果ContextContainer已存在配置则优先返回该配置
     * 否则返回JavaConfig内部维护的默认配置
     * @param clazz JavaConfig子类的类
     * @param <T> JavaConfig的子类
     * @return JavaConfig的子类实例
     */
    public static <T extends JavaConfig> T getConfig(Class<? extends JavaConfig> clazz){
        Object config = ContextContainer.getApplicationContext().getBean(clazz);
        if (config != null){
            Console.log("{} [CogoConfig]从容器中获取配置类成功[{}]",Environment.getSystemTime(), config.getClass().getName());
            return (T) config;
        }
        T tConfig = (T) CONFIGS.get(clazz);
        Console.log("{} [CogoConfig]从JavaConfig中获取配置类成功[{}]",Environment.getSystemTime(), tConfig.getClass().getName());
        return tConfig;
    }

    @Deprecated
    public static <T extends JavaConfig> T getConfig(String configName){
        return (T)ContextContainer.getApplicationContext().getBean(configName);
    }
}
